package com.wujie.mall.domain.payment;

/**
 * 支付渠道接口
 * 定义所有支付渠道的统一接口
 * 
 * @author wujie
 * @since 2024-08-26
 */
public interface PaymentChannel {

    /**
     * 发起支付
     * @param request 支付请求
     * @return 支付响应
     */
    PaymentResponse pay(PaymentRequest request);

    /**
     * 查询支付状态
     * @param orderNo 订单号
     * @return 支付响应
     */
    PaymentResponse queryPaymentStatus(String orderNo);

    /**
     * 取消支付
     * @param orderNo 订单号
     * @return 支付响应
     */
    PaymentResponse cancelPayment(String orderNo);

    /**
     * 获取支付类型
     * @return 支付类型
     */
    PaymentType getPaymentType();

    /**
     * 是否支持该支付类型
     * @param paymentType 支付类型
     * @return true-支持，false-不支持
     */
    default boolean supports(PaymentType paymentType) {
        return getPaymentType() == paymentType;
    }

    /**
     * 验证支付请求
     * @param request 支付请求
     * @throws IllegalArgumentException 请求无效时抛出
     */
    default void validateRequest(PaymentRequest request) {
        if (request == null) {
            throw new IllegalArgumentException("支付请求不能为空");
        }
        if (request.getOrderNo() == null || request.getOrderNo().trim().isEmpty()) {
            throw new IllegalArgumentException("订单号不能为空");
        }
        if (request.getAmount() == null || request.getAmount().compareTo(java.math.BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("支付金额必须大于0");
        }
        if (request.getPaymentType() != getPaymentType()) {
            throw new IllegalArgumentException("支付类型不匹配");
        }
    }
}